package ai.assist.common.model;

import io.swagger.annotations.ApiModel;
import lombok.Data;

import java.util.Collections;
import java.util.List;

/**
 * @author hui
 * @Date 2024/3/11 下午10:50
 **/
@Data
@ApiModel
public class PageResponseVO<T> {

    private static final long serialVersionUID = 8545996863226528798L;
    protected List<T> records;
    protected long total;
    protected long size;
    protected long current;
    protected boolean optimizeCountSql;
    protected boolean searchCount;
    protected boolean optimizeJoinOfCountSql;
    protected String countId;
    protected Long maxLimit;

    public PageResponseVO() {
        this.records = Collections.emptyList();
        this.total = 0L;
        this.size = 10L;
        this.current = 1L;
        this.optimizeCountSql = true;
        this.searchCount = true;
        this.optimizeJoinOfCountSql = true;
    }

    public PageResponseVO(long current, long size) {
        this(current, size, 0L);
    }

    public PageResponseVO(long current, long size, long total) {
        this(current, size, total, true);
    }

    public PageResponseVO(long current, long size, boolean searchCount) {
        this(current, size, 0L, searchCount);
    }

    public PageResponseVO(long current, long size, long total, boolean searchCount) {
        this.records = Collections.emptyList();
        this.total = 0L;
        this.size = 10L;
        this.current = 1L;
        this.optimizeCountSql = true;
        this.searchCount = true;
        this.optimizeJoinOfCountSql = true;
        if (current > 1L) {
            this.current = current;
        }

        this.size = size;
        this.total = total;
        this.searchCount = searchCount;
    }

    public boolean hasPrevious() {
        return this.current > 1L;
    }

    public boolean hasNext() {
        return this.current < this.getPages();
    }

    public List<T> getRecords() {
        return this.records;
    }

    public PageResponseVO<T> setRecords(List<T> records) {
        this.records = records;
        return this;
    }

    public long getTotal() {
        return this.total;
    }

    public PageResponseVO<T> setTotal(long total) {
        this.total = total;
        return this;
    }

    public long getSize() {
        return this.size;
    }

    public PageResponseVO<T> setSize(long size) {
        this.size = size;
        return this;
    }

    public long getCurrent() {
        return this.current;
    }

    public PageResponseVO<T> setCurrent(long current) {
        this.current = current;
        return this;
    }

    public String countId() {
        return this.countId;
    }

    public Long maxLimit() {
        return this.maxLimit;
    }

    public boolean optimizeCountSql() {
        return this.optimizeCountSql;
    }

    public static <T> PageResponseVO<T> of(long current, long size, long total, boolean searchCount) {
        return new PageResponseVO(current, size, total, searchCount);
    }

    public boolean optimizeJoinOfCountSql() {
        return this.optimizeJoinOfCountSql;
    }

    public PageResponseVO<T> setSearchCount(boolean searchCount) {
        this.searchCount = searchCount;
        return this;
    }

    public PageResponseVO<T> setOptimizeCountSql(boolean optimizeCountSql) {
        this.optimizeCountSql = optimizeCountSql;
        return this;
    }

    public long getPages() {
        return this.getPages();
    }

    public static <T> PageResponseVO<T> of(long current, long size) {
        return of(current, size, 0L);
    }

    public static <T> PageResponseVO<T> of(long current, long size, long total) {
        return of(current, size, total, true);
    }

    public static <T> PageResponseVO<T> of(long current, long size, boolean searchCount) {
        return of(current, size, 0L, searchCount);
    }

    public boolean searchCount() {
        return this.total < 0L ? false : this.searchCount;
    }

    public void setOptimizeJoinOfCountSql(final boolean optimizeJoinOfCountSql) {
        this.optimizeJoinOfCountSql = optimizeJoinOfCountSql;
    }

    public void setCountId(final String countId) {
        this.countId = countId;
    }

    public void setMaxLimit(final Long maxLimit) {
        this.maxLimit = maxLimit;
    }


}
